// ThreadPool.h: interface for the CThreadPool class.
//
//////////////////////////////////////////////////////////////////////

#ifndef __THREADPOOL_H__
#define __THREADPOOL_H__

#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <map>
#include <set>
#include <list>
#include <iostream>

using namespace std;

namespace Model
{

	class IThreadProc
	{
		public:
			virtual ~IThreadProc(){};
		public:
			virtual void Process( int index,void* param, int size ) = 0 ;
	};

	//待处理数据
	typedef struct _data
	{
		//还有剩余数据吗？
		bool* bDataRemain;
		//producer准备好接受结束信号了吗？
		bool *bReady;
		//producer thread lock
		pthread_mutex_t * pLocker;
		//producer thread condition
		pthread_cond_t * pCond;
		//针对指定producer的worker活动线程数
		int* pBusyNum;
		//worker thread
		IThreadProc* pTheadProc;
		//worker 要处理的数据
		void * param;
		//数据长度
		int    dataSize;
	} struData ;

	class CThreadPool
	{
		public:
			CThreadPool();
			virtual ~CThreadPool();
		private:
			//线程id
			map<int , pthread_t >  m_mapTids;

			//线程池参数
			typedef struct _thread_param
			{
				CThreadPool* pThis;

				//唤醒定时
				int timer;

				//工作中的线程数
				int iBusy;

				pthread_mutex_t * pMutex;

				pthread_cond_t * pCond;

				bool bExit;

				//tid映射
				map<int , pthread_t >*  pTids;

				list< struData > * pDataList;

				//create 参数
				void * param;

			} thread_param_struct;


			//线程函数参数
			thread_param_struct m_struThreadParam;
			//条件等待互斥锁
			mutable pthread_mutex_t m_mutex;
			//线程等待条件
			mutable pthread_cond_t m_condition;

			//待处理数据量
			mutable unsigned int m_iDataCount;
			//待处理数据列表
			mutable list< struData > m_dataList;
			//线程数
			int m_threadCount;
		private:
			//线程函数
			static void * ThreadProc( void * param );
			//分配数据缓存
			char * AllocBuf( int size );
			//释放数据缓存
			void FreeBuf( char* &data );
		protected:
			//初始化线程资源
			virtual int InitThreads( int timer , void* param );

		public:
			// 启动线程
			// threadCount : 启动线程数
			// pTheadProc :  线程得到信号后执行的处理函数
			// timer :  是否定时唤醒线程,timer<=0表示不唤醒
			int CreatePool( unsigned int threadCount, int timer = 0 , void * param = NULL );
			// 停止线程
			virtual int StopPool( void );
			// 设置线程的休眠时间,单位：毫秒，只对下次执行后的等待有效
			void SetSleepTime( int t );

			void mySleep(int ms);

			void freeListMem() const
			{
				pthread_mutex_lock(&m_mutex);
				if(m_dataList.empty())
				{
					list< struData >().swap(m_dataList);
				}
				pthread_mutex_unlock(&m_mutex);
			}
		public:
			// 通知线程
			virtual int Dispatch(struData* pData) const;
			// 通知所有线程
			virtual int DispatchAll(struData* pData = NULL);
			// 是否还有线程在工作
			bool isBusy();
			//线程数
			int getThreadCount();
	};//end of class CThreadPool
}
#endif 
